package cn.com.maven.designpattern.singleton;

/**
 * 用枚举实现单例
 * Java虚拟机会保证枚举类型不能被反射并且构造函数只被执行一次。
 * 对于序列化和反序列化，因为每一个枚举类型和枚举变量在JVM中都是唯一的，即Java在序列化和反序列化枚举时做了特殊的规定，
 * 枚举的writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法是被编译器禁用的，
 * 因此也不存在实现序列化接口后调用readObject会破坏单例的问题。
 * @Author YongQiang
 * @Date 2021/5/18 13:00
 * @Version 1.0
 */
public class EnumSingleton {

    public static enum SingletonEnum {
        SINGLETON_ENUM;
        private EnumSingleton enumSingleton = null;

        private SingletonEnum() {
            enumSingleton = new EnumSingleton();
        }

        public EnumSingleton getInstance() {
            return enumSingleton;
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()-> System.out.println(SingletonEnum.SINGLETON_ENUM.getInstance())).start();
        }
    }
}
